#pragma once

#include <array>
#include <cstddef>
#include <numeric>

// inline 函数：允许多个翻译单元包含同一个定义
inline int add(int lhs, int rhs) noexcept {
  return lhs + rhs;
}

// inline constexpr 变量：C++17 引入，C++20 中广泛使用
inline constexpr double kPi = 3.14159265358979323846;

// inline constinit 变量：C++20 保证静态初始化
inline constinit int g_init_calls = 0;

// inline 函数模版：模板本身隐式 inline，这里显式标注强调 ODR
template <typename T, std::size_t N>
inline T sum(const std::array<T, N>& arr) {
  return std::accumulate(arr.begin(), arr.end(), T{});
}

// inline static 成员示例
struct Stats {
  inline static int object_count = 0;

  Stats() noexcept { ++object_count; }
  ~Stats() noexcept { --object_count; }
};